//相比于object.defineproperty
//Proxy可以直接监听对象而非属性
//proxy可以劫持整个对象，并返回一个新对象，不管试操作便利程度还是底层功能上都远强于Object.defineProperty
//Proxy可以直接监听数组变化
//Proxy有多达十三种拦截方法 不限于apply、ownKeys、deleteProperty、has等等是Object.defineProperty不具备的。

const queObservers = new Set();
const observe = fn=>queObservers.add(fn);
const observable = obj => new Proxy(obj,{set});
function set(target,key,value,receiver){
    const result = Reflect.set(target,key,value,receiver);
    queObservers.forEach(observer => observer());
    return result
}

const person = observable({
    name:'张三',
    age:20
})
function print(){
    console.log(`${person.name},${person.age}`)
}
observe(print);
person.name = '历史'
person.age = 18
